!--------------------------------
! Programa dedicado para calcular
! a representacao de um dado numero
! em uma dada base.
!
! Calculados:
! 1) Menor numero representavel ("precisao em torno do zero").
! 2) Precisao ("em torno do um") calculada com decimais.
! 3) Precisao ("em torno do um) calculada com binarios.
!
! Programa compilado e testado com:
! $ gfortran -o exec01 exec01.f90
! $ ./exec01
!
! Ler saida resultante da execucao.
!
! _o_o_ oOo _o_o_ 25/08/2010



PROGRAM exec01
  IMPLICIT NONE
  REAL(4) :: r4=1., r41=2.
  REAL(8) :: r8=1., r81=2.
  INTEGER :: i=0, j=0

  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !! MENOR NUMERO (PRECISAO EM TORNO DO ZERO)
  ! Loop para achar o menor numero
  ! (a precisao maxima em torno do zero)
  ! note que a precisao eh menor em torno do 1 
  ! ou outro numero em modulo maior que zero 
  do while (r4>0)
    i=i+1
    r4=1.0/(10.0**i)
    !write(*,*) r4, i
  end do

  ! Loop para achar o menor numero
  ! (a precisao maxima em torno do zero)
  ! note que a precisao eh menor em torno do 1 
  ! ou outro numero em modulo maior que zero 
  do while (r8>0)
    j=j+1
    r8=1.0/(10.0**j)
    !write(*,*) r8, j
  end do
 
  write(*,*) "************************"
  write(*,*) "************************"
  write(*,*) "Achando o menor numero (precisao em torno do zero)"
  write(*,*) "************************"
  write(*,*) "Quando a precisao eh simples, i.e. 'REAL(4)'"
  write(*,*) "A MAQUINA ACHA QUE", 1.0d0/10.0d0**i, "VALE ZERO"

  write(*,*) "\nQuando a precisao eh dupla, i.e. 'REAL(8)'"
  ! Ateh onde pude descobrir, 
  ! a linguagem nao representa este numero de forma nativa, 
  ! portanto eh necessario 
  ! apresenta-lo em forma decomposta
  write(*,*) "A MAQUINHA ACHA QUE", 1./10, "ELEVADO A", j, "VALE ZERO"

  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !! PRECISAO EM TORNO DO UM ATRAVES DE DECIMAIS
  ! Loop para achar a precisao maxima em torno do um
  ! note que a precisao eh menor em torno do 1 
  ! ou outro numero em modulo maior que zero 
  i=0
  do while (r41/=1.0)
    i=i+1
    r41=1.0+1.0/(10.0**i)
    !write(*,*) r41, i
  end do

  ! Loop para achar a precisao maxima em torno do um
  ! note que a precisao eh menor em torno do 1 
  ! ou outro numero em modulo maior que zero 
  j=0
  do while (r81/=1.0d0)
    j=j+1
    r81=1.0d0+1.0d0/((10.0d0)**j)
    !write(*,*) r81, j
  end do

  write(*,*) "\n************************"
  write(*,*) "\n************************"
  write(*,*) "Achando a precisao em torno do um"
  write(*,*) "Atraves de DECIMAIS"
  write(*,*) "************************"
  write(*,*) "Quando a precisao eh simples, i.e. 'REAL(4)'"
  write(*,*) "A MAQUINA ACHA QUE", 1.0d0/(10.0d0**i), "VALE ZERO"

  write(*,*) "\nQuando a precisao eh dupla, i.e. 'REAL(8)'"
  write(*,*) "A MAQUINHA ACHA QUE", 1.0d0/(10.0d0**j), "VALE ZERO"


  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  !! PRECISAO EM TORNO DO UM ATRAVES DE BINARIOS
  ! Loop para achar a precisao maxima em torno do um
  ! note que a precisao eh menor em torno do 1 
  ! ou outro numero em modulo maior que zero 
  r41=2.0
  i=0
  do while (r41/=1.0)
    i=i+1
    r41=1.0+1.0/(2.0**i)
    !write(*,*) r41, i
  end do

  ! Loop para achar a precisao maxima em torno do um
  ! note que a precisao eh menor em torno do 1 
  ! ou outro numero em modulo maior que zero 
  r81=2.0
  j=0
  do while (r81/=1.0d0)
    j=j+1
    r81=1.0d0+1.0d0/((2.0d0)**j)
    !write(*,*) r81, j
  end do

  write(*,*) "\n************************"
  write(*,*) "\n************************"
  write(*,*) "Achando a precisao em torno do um"
  write(*,*) "Atraves de BINARIOS (Achando o numero exato, correto!)"
  write(*,*) "************************"
  write(*,*) "Quando a precisao eh simples, i.e. 'REAL(4)'"
  write(*,*) "A MAQUINA ACHA QUE", 1.0d0/(2.0d0**i), "VALE ZERO"

  write(*,*) "\nQuando a precisao eh dupla, i.e. 'REAL(8)'"
  write(*,*) "A MAQUINHA ACHA QUE", 1.0d0/(2.0d0**j), "VALE ZERO"


end PROGRAM

